<<<<<<< HEAD
// // #include <iostream>
// // using namespace std;

// // class Instrument
// // {
// // public:
// //     int price;
// //     void tune() { cout << "Instrument::tune()" << endl; }
// //     virtual void play() { cout << "Instrument::play()" << endl; }
// // };

// // class Violin : public Instrument
// // {
// // public:
// //     void tune() { cout << "Violin::tune()" << endl; } // (1)//重写隐藏，基类函数不是虚函数
// // };

// // void tune(Instrument *p)
// // {
// //     p->tune();
// // }

// // int main()
// // {
// //     Violin obj;
// //     tune(&obj); // (2)
// //     return 0;
// // }
// #include <iostream>

// struct A
// {
//     A() { foo(); }
//     virtual ~A() { foo(); }
//     virtual void foo() { std::cout << "1"; }
//     void bar() { foo(); }
// };

// struct B : public A
// {
//     virtual void foo() { std::cout << "2"; }
// };

// int main()
// {
//     B b;
//     b.bar();
// }
#include <iostream>
using namespace std;
class Base
{
public:
    virtual void foo() {}
    virtual void foo(int) {}
    void bar() {}
};

class Derived1 : public Base
{
public:
    void foo() {}
    void foo(int) {}
};

class Derived2 : public Base
{
public:
    void foo(float) {} // (a)
};

int main()
{
    Derived1 d1;
    Derived2 d2;
    // d1.bar();  // (1)
    d2.foo(3.0); // (2)

    Base *pb1 = &d1;
    Base *pb2 = &d2;
    pb1->foo(3);   // (3)
    pb2->foo(3.0); // (4)

    Base b1 = d1;
    b1.foo(); // (5)

    Derived2 *pd2 = &d2;
    pd2->foo(3.0); // (6)
=======
#include <iostream>
using namespace std;

// (1)
template <typename T0>
class A
{
    T0 value;

public:
    void set(const T0 &v)
    {
        value = v;
    }
    T0 get();
};

// (2)
template <typename T1>
T1 A<T1>::get() { return value; }

template <typename T0, typename T1>
T1 sum(T0 a, T0 b)
{
    return T1(a.get() + b.get());
}

int main()
{
    A<double> a;
    a.set(4.3);
    cout << a.get() << endl;
    cout << sum<A<double>, int>(a, a) << endl;
    // (3)
>>>>>>> 3898197 (第四次OJ)
    return 0;
}
